home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 April: Mac OS SDK / Dev.CD Apr 99 SDK1.toast / Development Kits / Apple Shared Library Manager / ASLM Examples / TestTools / Sources / TestMisc.cp < prev    next >
Encoding:
Text File  |  1996-11-19  |  20.4 KB  |  626 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        TestMisc.cp
  3.  
  4.     Contains:    Implementation of class TTestMisc
  5.  
  6.     Copyright:    © 1992-1994 by Apple Computer, Inc., all rights reserved.
  7.  
  8. */
  9.  
  10. #ifndef __TESTMISC__
  11. #include "TestMisc.h"
  12. #endif
  13. #ifndef __LIBRARYMANAGERCLASSES__
  14. #include <LibraryManagerClasses.h>
  15. #endif
  16. #ifndef __MITEST1__
  17. #include "MITest1.h"
  18. #endif
  19. #ifndef __BACKDEPLIB__
  20. #include "BackDepLib.h"
  21. #endif
  22.  
  23. TTestMisc::TTestMisc()
  24. {}
  25.  
  26. TTestMisc::~TTestMisc()
  27. {}
  28.  
  29. void TTestMisc::InitTest(BooleanParm, BooleanParm, int, char**)
  30. {
  31.     ClientData* data = (ClientData*)GetClientData();
  32.     if (data->fData != 0)
  33.         Printf("### ERROR: fData field of ClientData not 0\n");
  34.     if (data->fPointer != 0)
  35.         Printf("### ERROR: fData field of ClientData not 0\n");
  36.     data->fData = 1;
  37.     data->fPointer = this;
  38. }
  39.  
  40. void TTestMisc::EndTest(BooleanParm, BooleanParm)
  41. {
  42.     ClientData* data = (ClientData*)GetClientData();
  43.     if (data->fData != 2)
  44.         Printf("### ERROR: fData field of ClientData not 2\n");
  45.     if (data->fPointer != (char*)this + 1)
  46.         Printf("### ERROR: fData field of ClientData not 'this' + 1\n");
  47. }
  48.  
  49. void TTestMisc::RunTestIteration(BooleanParm verbose, BooleanParm debug)
  50. {
  51.     //
  52.     // First make sure the backwards dependency libraries load and
  53.     // unload ok.
  54.     //
  55.     Printf("### INFO: Testing backwards dependencies.\n");
  56.     OSErr err = LoadClass(ClassID(kTBackDep1ID),true);
  57.     if (err == kNoError)
  58.         UnloadClass(ClassID(kTBackDep1ID));
  59.     else
  60.         Printf("### ERROR: LoadClass on TBackDep1 class failed.\n");
  61.  
  62.     //
  63.     // Test FindLibrary
  64.     //
  65.     TLibrary* test = LookupLibrary(ClassID("appl:test$TestLibrary"));
  66.     if (test == NULL)
  67.         Printf("### ERROR: LookupLibrary returned NULL\n");
  68.     else
  69.         if (test != GetLocalLibrary())
  70.             Printf("### ERROR: LookupLibrary return %08lX instead of %08lX\n",
  71.                    test, GetLocalLibrary());
  72.                    
  73.     test = LookupLibraryWithClassID(ClassID(kTTestMiscID));
  74.     if (test == NULL)
  75.         Printf("### ERROR: LookupLibraryWithClassID returned NULL\n");
  76.     else
  77.         if (test != GetLocalLibrary())
  78.             Printf("### ERROR: LookupLibraryWithClassID return %08lX instead of %08lX\n",
  79.                    test, GetLocalLibrary());
  80.     //
  81.     // Test GetClientData
  82.     //
  83.     ClientData* data = (ClientData*)GetClientData();
  84.     if (data->fData != 1)
  85.         Printf("### ERROR: fData field of ClientData not 1\n");
  86.     if (data->fPointer != this)
  87.         Printf("### ERROR: fData field of ClientData not 'this'\n");
  88.     data->fData = 2;
  89.     data->fPointer = (char*)this + 1;
  90.     //
  91.     // Test TClassInfo
  92.     //
  93.     {
  94.         if (verbose)
  95.             Printf("### INFO: Testing TClassInfo\n");
  96.         OSErr err;
  97.         TClassInfo* info = GetClassInfo(*(TClassID*)kTTestMiscID, &err);
  98.         if (info == NULL)
  99.         {
  100.             Printf("### ERROR: Got Error #%d for GetClassInfo on ID \"%s\".\n",
  101.                    err, kTTestMiscID);
  102.         }
  103.         else
  104.         {
  105.             TClassID* id = info->GetParentID(1);
  106.             if (id != NULL)
  107.                 Printf("### ERROR: Got ClassID \"%s\" for 2nd parent of \"%s\".\n",
  108.                        id, kTTestMiscID);
  109.             id = info->GetParentID(0);
  110.             if (id == NULL)
  111.                 Printf("### ERROR: Got no ClassID for the parent of \"%s\".\n",
  112.                        kTTestMiscID);
  113.             else
  114.                 if (*id != ClassID(kTTestToolID))
  115.                     Printf("### ERROR: Get ClassID \"%s\" for parent of \"%s\"\n"
  116.                            "           instead of \"%s\".\n",
  117.                            id, kTTestMiscID, kTTestToolID);
  118.         }
  119.         delete info;
  120.     }
  121.  
  122. #if !defined(__SC__) && !defined(__MRC__)
  123.     //
  124.     // Test TClassInfo on Multiple Inheritance
  125.     //
  126.     {
  127.         if (verbose)
  128.             Printf("### INFO: Testing TClassInfo with multiple inheritance\n");
  129.         OSErr err;
  130.         TClassInfo* info = GetClassInfo(*(TClassID*)kTMixedClassID, &err);
  131.         if (info == NULL)
  132.         {
  133.             Printf("### ERROR: Got Error #%d for GetClassInfo on ID \"%s\".\n",
  134.                    err, kTMixedClassID);
  135.         }
  136.         else
  137.         {
  138.             TClassID* id = info->GetParentID(3);
  139.             if (id != NULL)
  140.                 Printf("### ERROR: Got ClassID \"%s\" for 4th parent of \"%s\".\n",
  141.                        id, kTMixedClassID);
  142.             id = info->GetParentID(0);
  143.             if (id == NULL)
  144.                 Printf("### ERROR: Got no ClassID for the parent of \"%s\".\n",
  145.                        kTStdDynamicID);
  146.             else
  147.                 if (*id != ClassID(kTStdDynamicID))
  148.                     Printf("### ERROR: Get ClassID \"%s\" for parent of \"%s\"\n"
  149.                            "           instead of \"%s\".\n",
  150.                            id, kTMixedClassID, kTStdDynamicID);
  151.             id = info->GetParentID(1);
  152.             if (id == NULL)
  153.                 Printf("### ERROR: Got no ClassID for the 2nd parent of \"%s\".\n",
  154.                        kTMixedClassID);
  155.             else
  156.                 if (*id != ClassID(kMMixin2ID))
  157.                     Printf("### ERROR: Get ClassID \"%s\" for 2nd parent of \"%s\"\n"
  158.                            "           instead of \"%s\".\n",
  159.                            id, kTMixedClassID, kMMixin2ID);
  160.             id = info->GetParentID(2);
  161.             if (id == NULL)
  162.                 Printf("### ERROR: Got no ClassID for the 3rd parent of \"%s\".\n",
  163.                        kTMixedClassID);
  164.             else
  165.                 if (*id != ClassID(kMMixin1ID))
  166.                     Printf("### ERROR: Get ClassID \"%s\" for 3rd parent of \"%s\"\n"
  167.                            "           instead of \"%s\".\n",
  168.                            id, kTMixedClassID, kMMixin1ID);
  169.             info->SetBaseClassID(ClassID(kMMixin1ID));
  170.             Printf("### INFO: Subclasses of MMixin1\n");
  171.             while ((id = (TClassID*)info->Next()) != NULL)
  172.             {
  173.                 Printf("###       %s\n", (const char*)id);
  174.             }
  175.  
  176.         }
  177.         delete info;
  178.     }
  179.  
  180.     {
  181.         if (verbose)
  182.             Printf("### INFO: Testing LoadClass on TMixedClass\n");
  183.         if (debug)
  184.             DebugBreak("About to load TMixedClass");
  185.         OSErr err = LoadClass(ClassID(kTMixedClassID), true);
  186.         if (err != kNoError)
  187.             Printf("### ERROR: Error #%d occurred from LoadClass of \"%s\".",
  188.                    err, kTMixedClassID);
  189.         else
  190.         {
  191.             err = UnloadClass(ClassID(kTMixedClassID));
  192.             if (err != kNoError)
  193.                 Printf("### ERROR: Error #%d occurred from UnloadClass of \"%s\".",
  194.                        err, kTMixedClassID);
  195.         }
  196.     }
  197.  
  198.     {
  199.         if (verbose)
  200.             Printf("### INFO: Testing VTables on TMixedClass\n");
  201.         if (debug)
  202.             DebugBreak("About to create a TMixedClass");
  203.         
  204.         TMixedClass foo(5);
  205.         int val;
  206.         //
  207.         // Operates on MMixin1::fieldm if all goes well
  208.         // Should subtract 2 from the 5 already there
  209.         //
  210.         if ((val = (&foo)->Sub1(2)) != 3)
  211.             Printf("### ERROR: TMixedClass::Foo - Expected 3, got %d\n", val);
  212.         //
  213.         // Operates on MMixin1::fieldm if all goes well
  214.         // Should add 4 to the 3 already there
  215.         //
  216.         if ((val = (&foo)->Add1(3)) != 7)
  217.             Printf("### ERROR: TMixedClass::Foo - Expected 7, got %d\n", val);
  218.         //
  219.         // Operates on fieldt if all goes well
  220.         // Should multiply by 20 to the 5 already there
  221.         //
  222.         if ((val = (&foo)->Mul(10)) != 100)
  223.             Printf("### ERROR: TMixedClass::Foo - Expected 100, got %d\n", val);
  224.         //
  225.         // Operates on MMixin2::fieldm if all goes well
  226.         // Should add 8 to the 5 already there
  227.         //
  228.         if ((val = (&foo)->Add2(8)) != 13)
  229.             Printf("### ERROR: TMixedClass::Foo - Expected 13, got %d\n", val);
  230.         //
  231.         // Operates on MMixin2::fieldm if all goes well
  232.         // Should subtract 5 from the 13 already there
  233.         //
  234.         if ((val = (&foo)->Sub2(3)) != 8)
  235.             Printf("### ERROR: TMixedClass::Foo - Expected 8, got %d\n", val);
  236.         //
  237.         // Operates on fieldt if all goes well
  238.         // Should divide by 5 to the 100 already there
  239.         //
  240.         if ((val = (&foo)->Div(5)) != 20)
  241.             Printf("### ERROR: TMixedClass::Foo - Expected 20, got %d\n", val);
  242.             
  243.         if (verbose)
  244.             Printf("### INFO: Testing CastObject on TMixedClass\n");
  245.  
  246.         TStdDynamic* sdyn = (TStdDynamic*)CastObject(&foo, ClassID(kTStdDynamicID));
  247.         if (sdyn == NULL)
  248.             Printf("### ERROR: CastObject to TStdDynamic returned NULL\n");
  249.         else
  250.             if (sdyn != (TStdDynamic*)&foo)
  251.                 Printf("### ERROR: CastObject to TStdDynamic return wrong value\n");
  252.         
  253.         MMixin1* mixin1 = (MMixin1*)CastObject(&foo, ClassID(kMMixin1ID));
  254.         if (mixin1 == NULL)
  255.             Printf("### ERROR: CastObject to MMixin1 returned NULL\n");
  256.         else
  257.             if (mixin1 != (MMixin1*)&foo)
  258.                 Printf("### ERROR: CastObject to MMixin1 return wrong value\n");
  259.     
  260.         MMixin2* mixin2 = (MMixin2*)CastObject(&foo, ClassID(kMMixin2ID));
  261.         if (mixin2 == NULL)
  262.             Printf("### ERROR: CastObject to MMixin2 returned NULL\n");
  263.         else
  264.             if (mixin2 != (MMixin2*)&foo)
  265.                 Printf("### ERROR: CastObject to MMixin2 return wrong value\n");
  266.  
  267.         if (sdyn)
  268.         {
  269.             TMixedClass* mix1 = (TMixedClass*)CastObject(sdyn, ClassID(kTMixedClassID));
  270.             if (sdyn == NULL)
  271.                 Printf("### ERROR: CastObject to TMixedClass from TStdDynamic returned NULL\n");
  272.             else
  273.                 if (mix1 != &foo)
  274.                     Printf("### ERROR: CastObject to TMixedClass from TStdDynamic return wrong value\n");
  275.             MMixin1* mixin1 = (MMixin1*)CastObject(sdyn, ClassID(kMMixin1ID));
  276.             if (mixin1 == NULL)
  277.                 Printf("### ERROR: CastObject to MMixin1 from TStdDynamic returned NULL\n");
  278.             else
  279.                 if (mixin1 != (MMixin1*)&foo)
  280.                     Printf("### ERROR: CastObject to MMixin1 from TStdDynamic return wrong value\n");
  281.         
  282.             MMixin2* mixin2 = (MMixin2*)CastObject(sdyn, ClassID(kMMixin2ID));
  283.             if (mixin2 == NULL)
  284.                 Printf("### ERROR: CastObject to MMixin2 from TStdDynamic returned NULL\n");
  285.             else
  286.                 if (mixin2 != (MMixin2*)&foo)
  287.                     Printf("### ERROR: CastObject to MMixin2 from TStdDynamic return wrong value\n");
  288.         }
  289.         
  290.         if (mixin1)
  291.         {
  292.             TMixedClass* mix1 = (TMixedClass*)CastObject(mixin1, ClassID(kTMixedClassID));
  293.             if (mix1 == NULL)
  294.                 Printf("### ERROR: CastObject to TMixedClass from MMixin1 returned NULL\n");
  295.             else
  296.                 if (mix1 != &foo)
  297.                     Printf("### ERROR: CastObject to TMixedClass from MMixin1 return wrong value\n");
  298.         }
  299.  
  300.         if (mixin2)
  301.         {
  302.             TMixedClass* mix2 = (TMixedClass*)CastObject(mixin2, ClassID(kTMixedClassID));
  303.             if (mix2 == NULL)
  304.                 Printf("### ERROR: CastObject to TMixedClass from MMixin2 returned NULL\n");
  305.             else
  306.                 if (mix2 != &foo)
  307.                     Printf("### ERROR: CastObject to TMixedClass from MMixin2 return wrong value\n");
  308.         }
  309.     }
  310.     {
  311.         if (verbose)
  312.             Printf("### INFO: Testing Stubs for TMixedClass\n");
  313.         if (debug)
  314.             DebugBreak("About to test TMixedClass stubs");
  315.         
  316.         TMixedClass foo(5);
  317.         int val;
  318.         //
  319.         // Operates on MMixin1::fieldm if all goes well
  320.         // Should subtract 2 from the 5 already there
  321.         //
  322.         if ((val = foo.Sub1(2)) != 3)
  323.             Printf("### ERROR: TMixedClass::Foo - Expected 3, got %d\n", val);
  324.         //
  325.         // Operates on MMixin1::fieldm if all goes well
  326.         // Should add 4 to the 3 already there
  327.         //
  328.         if ((val = foo.Add1(3)) != 7)
  329.             Printf("### ERROR: TMixedClass::Foo - Expected 7, got %d\n", val);
  330.         //
  331.         // Operates on fieldt if all goes well
  332.         // Should multiply by 20 to the 5 already there
  333.         // We don't want to go through a stub here since Mul is implemented
  334.         // in TMainClass which is not an exported class and we don't want to
  335.         // have to statically link with the implementation.
  336.         //
  337.         if ((val = (&foo)->Mul(10)) != 100)
  338.             Printf("### ERROR: TMixedClass::Foo - Expected 100, got %d\n", val);
  339.         //
  340.         // Operates on MMixin2::fieldm if all goes well
  341.         // Should add 8 to the 5 already there
  342.         //
  343.         if ((val = foo.Add2(8)) != 13)
  344.             Printf("### ERROR: TMixedClass::Foo - Expected 13, got %d\n", val);
  345.         //
  346.         // Operates on MMixin2::fieldm if all goes well
  347.         // Should subtract 5 from the 13 already there
  348.         //
  349.         if ((val = foo.Sub2(3)) != 8)
  350.             Printf("### ERROR: TMixedClass::Foo - Expected 8, got %d\n", val);
  351.         //
  352.         // Operates on fieldt if all goes well
  353.         // Should divide by 5 to the 100 already there
  354.         //
  355.         if ((val = foo.Div(5)) != 20)
  356.             Printf("### ERROR: TMixedClass::Foo - Expected 20, got %d\n", val);
  357.             
  358.     }
  359.     {
  360.         if (verbose)
  361.             Printf("### INFO: Testing VTables on TMixedClass2\n");
  362.         if (debug)
  363.             DebugBreak("About to create a TMixedClass2");
  364.         
  365.         TMixedClass2 foo(5);
  366.         int val;
  367.         //
  368.         // Operates on MMixin1::fieldm if all goes well
  369.         // Should subtract 2 from the 5 already there
  370.         //
  371.         if ((val = (&foo)->Sub1(2)) != 3)
  372.             Printf("### ERROR: TMixedClass2::Foo - Expected 3, got %d\n", val);
  373.         //
  374.         // Operates on MMixin1::fieldm if all goes well
  375.         // Should add 3 to the 3 already there
  376.         //
  377.         if ((val = (&foo)->Add1(3)) != 6)
  378.             Printf("### ERROR: TMixedClass2::Foo - Expected 6, got %d\n", val);
  379.         //
  380.         // Operates on fieldt if all goes well
  381.         // Should multiply by 10 to the 5 already there
  382.         //
  383.         if ((val = (&foo)->Mul(10)) != 50)
  384.             Printf("### ERROR: TMixedClass2::Foo - Expected 50, got %d\n", val);
  385.         //
  386.         // Operates on MMixin2::fieldm if all goes well
  387.         // Should add 8 to the 5 already there
  388.         //
  389.         if ((val = (&foo)->Add2(8)) != 13)
  390.             Printf("### ERROR: TMixedClass2::Foo - Expected 13, got %d\n", val);
  391.         //
  392.         // Operates on MMixin2::fieldm if all goes well
  393.         // Should subtract 3 from the 13 already there
  394.         //
  395.         if ((val = (&foo)->Sub2(3)) != 10)
  396.             Printf("### ERROR: TMixedClass2::Foo - Expected 10, got %d\n", val);
  397.         //
  398.         // Operates on fieldt if all goes well
  399.         // Should divide by 5 to the 50 already there
  400.         //
  401.         if ((val = (&foo)->Div(5)) != 10)
  402.             Printf("### ERROR: TMixedClass::Foo - Expected 10, got %d\n", val);
  403.         //
  404.         // Operates on MMixin3::fieldm if all goes well
  405.         // Should Add 10 to the 5 already there
  406.         //
  407.         if ((val = (&foo)->Add3(10)) != 15)
  408.             Printf("### ERROR: TMixedClass2::Foo - Expected 15, got %d\n", val);
  409.         //
  410.         // Operates on MMixin3::fieldm if all goes well
  411.         // Should subtract 11 from the 15 already there
  412.         //
  413.         if ((val = (&foo)->Sub3(8)) != 4)
  414.             Printf("### ERROR: TMixedClass::Foo - Expected 4, got %d\n", val);
  415.             
  416.         if (verbose)
  417.             Printf("### INFO: Testing CastObject on TMixedClass2\n");
  418.  
  419.         TMixedClass* mixed = (TMixedClass*)CastObject(&foo, ClassID(kTMixedClassID));
  420.         if (mixed == NULL)
  421.             Printf("### ERROR: CastObject to TMixedClass returned NULL\n");
  422.         else
  423.             if (mixed != (TMixedClass*)&foo)
  424.                 Printf("### ERROR: CastObject to TMixedClass return wrong value\n");
  425.  
  426.         TStdDynamic* sdyn = (TStdDynamic*)CastObject(&foo, ClassID(kTStdDynamicID));
  427.         if (sdyn == NULL)
  428.             Printf("### ERROR: CastObject to TStdDynamic returned NULL\n");
  429.         else
  430.             if (sdyn != (TStdDynamic*)&foo)
  431.                 Printf("### ERROR: CastObject to TStdDynamic return wrong value\n");
  432.             else
  433.                 Printf("### INFO: TStdDynamic value was %08lX\n", sdyn);
  434.  
  435.         MMixin1* mixin1 = (MMixin1*)CastObject(&foo, ClassID(kMMixin1ID));
  436.         if (mixin1 == NULL)
  437.             Printf("### ERROR: CastObject to MMixin1 returned NULL\n");
  438.         else
  439.             if (mixin1 != (MMixin1*)&foo)
  440.                 Printf("### ERROR: CastObject to MMixin1 return wrong value\n");
  441.             else
  442.                 Printf("### INFO: MMixin1 value was %08lX\n", mixin1);
  443.  
  444.         MMixin2* mixin2 = (MMixin2*)CastObject(&foo, ClassID(kMMixin2ID));
  445.         if (mixin2 == NULL)
  446.             Printf("### ERROR: CastObject to MMixin2 returned NULL\n");
  447.         else
  448.             if (mixin2 != (MMixin2*)&foo)
  449.                 Printf("### ERROR: CastObject to MMixin2 return wrong value\n");
  450.             else
  451.                 Printf("### INFO: MMixin2 value was %08lX\n", mixin2);
  452.  
  453.         MMixin3* mixin3 = (MMixin3*)CastObject(&foo, ClassID(kMMixin3ID));
  454.         if (mixin3 == NULL)
  455.             Printf("### ERROR: CastObject to MMixin3 returned NULL\n");
  456.         else
  457.             if (mixin3 != (MMixin3*)&foo)
  458.                 Printf("### ERROR: CastObject to MMixin3 return wrong value\n");
  459.             else
  460.                 Printf("### INFO: MMixin3 value was %08lX\n", mixin3);
  461.  
  462.         if (sdyn)
  463.         {
  464.             TMixedClass2* mix1 = (TMixedClass2*)CastObject(sdyn, ClassID(kTMixedClass2ID));
  465.             if (mix1 == NULL)
  466.                 Printf("### ERROR: CastObject to TMixedClass from TStdDynamic returned NULL\n");
  467.             else
  468.                 if (mix1 != &foo)
  469.                     Printf("### ERROR: CastObject to TMixedClass from TStdDynamic return wrong value\n");
  470.             MMixin1* mmix1 = (MMixin1*)CastObject(sdyn, ClassID(kMMixin1ID));
  471.             if (mmix1 == NULL)
  472.                 Printf("### ERROR: CastObject to MMixin1 from TStdDynamic returned NULL\n");
  473.             else
  474.                 if (mmix1 != (MMixin1*)&foo)
  475.                     Printf("### ERROR: CastObject to MMixin1 from TStdDynamic return %08lX instead of %08lX\n",
  476.                            mmix1, (MMixin1*)&foo);
  477.             MMixin2* mmix2 = (MMixin2*)CastObject(sdyn, ClassID(kMMixin2ID));
  478.             if (mmix2 == NULL)
  479.                 Printf("### ERROR: CastObject to MMixin2 from MMixin1 returned NULL\n");
  480.             else
  481.                 if (mmix2 != (MMixin2*)&foo)
  482.                     Printf("### ERROR: CastObject to MMixin2 from MMixin1 return %08lX instead of %08lX\n",
  483.                            mmix2, (MMixin2*)&foo);
  484.             MMixin3* mmix3 = (MMixin3*)CastObject(sdyn, ClassID(kMMixin3ID));
  485.             if (mmix3 == NULL)
  486.                 Printf("### ERROR: CastObject to MMixin3 from TStdDynamic returned NULL\n");
  487.             else
  488.                 if (mmix3 != (MMixin3*)&foo)
  489.                     Printf("### ERROR: CastObject to MMixin3 from TStdDynamic return %08lX instead of %08lX\n",
  490.                            mmix3, (MMixin3*)&foo);
  491.         }
  492.         if (mixin1)
  493.         {
  494.             TMixedClass2* mix1 = (TMixedClass2*)CastObject(mixin1, ClassID(kTMixedClass2ID));
  495.             if (mix1 == NULL)
  496.                 Printf("### ERROR: CastObject to TMixedClass from MMixin1 returned NULL\n");
  497.             else
  498.                 if (mix1 != &foo)
  499.                     Printf("### ERROR: CastObject to TMixedClass from MMixin1 return wrong value\n");
  500.             MMixin2* mmix2 = (MMixin2*)CastObject(mixin1, ClassID(kMMixin2ID));
  501.             if (mmix2 == NULL)
  502.                 Printf("### ERROR: CastObject to MMixin2 from MMixin1 returned NULL\n");
  503.             else
  504.                 if (mmix2 != (MMixin2*)&foo)
  505.                     Printf("### ERROR: CastObject to MMixin2 from MMixin1 return %08lX instead of %08lX\n",
  506.                            mmix2, (MMixin2*)&foo);
  507.             MMixin3* mmix3 = (MMixin3*)CastObject(mixin1, ClassID(kMMixin3ID));
  508.             if (mmix3 == NULL)
  509.                 Printf("### ERROR: CastObject to MMixin3 from MMixin1 returned NULL\n");
  510.             else
  511.                 if (mmix3 != (MMixin3*)&foo)
  512.                     Printf("### ERROR: CastObject to MMixin3 from MMixin1 return %08lX instead of %08lX\n",
  513.                            mmix3, (MMixin3*)&foo);
  514.         }
  515.  
  516.         if (mixin2)
  517.         {
  518.             TMixedClass2* mix2 = (TMixedClass2*)CastObject(mixin2, ClassID(kTMixedClass2ID));
  519.             if (mix2 == NULL)
  520.                 Printf("### ERROR: CastObject to TMixedClass from MMixin2 returned NULL\n");
  521.             else
  522.                 if (mix2 != &foo)
  523.                     Printf("### ERROR: CastObject to TMixedClass from MMixin2 return wrong value\n");
  524.  
  525.             MMixin1* mmix1 = (MMixin1*)CastObject(mixin2, ClassID(kMMixin1ID));
  526.             if (mmix1 == NULL)
  527.                 Printf("### ERROR: CastObject to MMixin1 from MMixin2 returned NULL\n");
  528.             else
  529.                 if (mmix1 != (MMixin1*)&foo)
  530.                     Printf("### ERROR: CastObject to MMixin1 from MMixin2 return %08lX instead of %08lX\n",
  531.                            mmix1, (MMixin1*)&foo);
  532.  
  533.             MMixin3* mmix3 = (MMixin3*)CastObject(mixin2, ClassID(kMMixin3ID));
  534.             if (mmix3 == NULL)
  535.                 Printf("### ERROR: CastObject to MMixin3 from MMixin2 returned NULL\n");
  536.             else
  537.                 if (mmix3 != (MMixin3*)&foo)
  538.                     Printf("### ERROR: CastObject to MMixin3 from MMixin2 return %08lX instead of %08lX\n",
  539.                            mmix3, (MMixin3*)&foo);
  540.         }
  541.         if (mixin3)
  542.         {
  543.             TMixedClass2* mix3 = (TMixedClass2*)CastObject(mixin3, ClassID(kTMixedClass2ID));
  544.             if (mix3 == NULL)
  545.                 Printf("### ERROR: CastObject to TMixedClass from MMixin3 returned NULL\n");
  546.             else
  547.                 if (mix3 != &foo)
  548.                     Printf("### ERROR: CastObject to TMixedClass from MMixin3 return wrong value\n");
  549.  
  550.             MMixin1* mmix1 = (MMixin1*)CastObject(mixin3, ClassID(kMMixin1ID));
  551.             if (mmix1 == NULL)
  552.                 Printf("### ERROR: CastObject to MMixin1 from MMixin3 returned NULL\n");
  553.             else
  554.                 if (mmix1 != (MMixin1*)&foo)
  555.                     Printf("### ERROR: CastObject to MMixin1 from MMixin3 return %08lX instead of %08lX\n",
  556.                            mmix1, (MMixin1*)&foo);
  557.  
  558.             MMixin2* mmix2 = (MMixin2*)CastObject(mixin3, ClassID(kMMixin2ID));
  559.             if (mmix2 == NULL)
  560.                 Printf("### ERROR: CastObject to MMixin2 from MMixin3 returned NULL\n");
  561.             else
  562.                 if (mmix2 != (MMixin2*)&foo)
  563.                     Printf("### ERROR: CastObject to MMixin2 from MMixin3 return %08lX instead of %08lX\n",
  564.                            mmix2, (MMixin2*)&foo);
  565.         }
  566.     }
  567.     {
  568.         if (verbose)
  569.             Printf("### INFO: Testing Stubs on TMixedClass2\n");
  570.         if (debug)
  571.             DebugBreak("About to create a TMixedClass2");
  572.         
  573.         TMixedClass2 foo(5);
  574.         int val;
  575.         //
  576.         // Operates on MMixin1::fieldm if all goes well
  577.         // Should subtract 2 from the 5 already there
  578.         //
  579.         if ((val = foo.Sub1(2)) != 3)
  580.             Printf("### ERROR: TMixedClass2::Foo - Expected 3, got %d\n", val);
  581.         //
  582.         // Operates on MMixin1::fieldm if all goes well
  583.         // Should add 3 to the 3 already there
  584.         //
  585.         if ((val = foo.Add1(3)) != 6)
  586.             Printf("### ERROR: TMixedClass2::Foo - Expected 6, got %d\n", val);
  587.         //
  588.         // Operates on fieldt if all goes well
  589.         // Should multiply by 10 to the 5 already there.
  590.         //
  591.         if ((val = foo.Mul(10)) != 50)
  592.             Printf("### ERROR: TMixedClass2::Foo - Expected 50, got %d\n", val);
  593.         //
  594.         // Operates on MMixin2::fieldm if all goes well
  595.         // Should add 8 to the 5 already there
  596.         //
  597.         if ((val = foo.Add2(8)) != 13)
  598.             Printf("### ERROR: TMixedClass2::Foo - Expected 13, got %d\n", val);
  599.         //
  600.         // Operates on MMixin2::fieldm if all goes well
  601.         // Should subtract 3 from the 13 already there
  602.         //
  603.         if ((val = foo.Sub2(3)) != 10)
  604.             Printf("### ERROR: TMixedClass2::Foo - Expected 10, got %d\n", val);
  605.         //
  606.         // Operates on fieldt if all goes well
  607.         // Should divide by 5 to the 50 already there
  608.         //
  609.         if ((val = foo.Div(5)) != 10)
  610.             Printf("### ERROR: TMixedClass::Foo - Expected 10, got %d\n", val);
  611.         //
  612.         // Operates on MMixin3::fieldm if all goes well
  613.         // Should Add 10 to the 5 already there
  614.         //
  615.         if ((val = foo.Add3(10)) != 15)
  616.             Printf("### ERROR: TMixedClass2::Foo - Expected 15, got %d\n", val);
  617.         //
  618.         // Operates on MMixin3::fieldm if all goes well
  619.         // Should subtract 11 from the 15 already there
  620.         //
  621.         if ((val = foo.Sub3(8)) != 4)
  622.             Printf("### ERROR: TMixedClass::Foo - Expected 4, got %d\n", val);
  623.     }            
  624. #endif
  625. }
  626.